﻿using System;
using Sireass.Dal;
using System.Data.SqlClient;
using Csla.Data;
using log4net;

namespace Sireass.DalSql
{
    public class AsignacionDal : IAsignacionDal
    {
		// Create a logger for use in this class
		private static readonly ILog log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        private SqlParameter accion = null;
        private string nombreProcedimiento = null;

        public AsignacionDal()
        {
            accion = new SqlParameter("@Accion", System.Data.SqlDbType.SmallInt);
            nombreProcedimiento = "spSireassTblAsignacion";
        }

        public System.Data.IDataReader Fetch()
        {
            using (var ctx = ConnectionManager<SqlConnection>.GetManager("SqlServer"))
            {
                var cm = ctx.Connection.CreateCommand();
                cm.CommandType = System.Data.CommandType.StoredProcedure;
                cm.CommandText = nombreProcedimiento;
                cm.Parameters.AddWithValue("@Accion", AccionDal.AccionSP.CONSULTAR);
                return cm.ExecuteReader();
            }
        }

        public System.Data.IDataReader Fetch(long idAsignacion)
        {
            using (var ctx = ConnectionManager<SqlConnection>.GetManager("SqlServer"))
            {
                var cm = ctx.Connection.CreateCommand();
                cm.CommandType = System.Data.CommandType.StoredProcedure;
                cm.CommandText = nombreProcedimiento;
                cm.Parameters.AddWithValue("@Accion", AccionDal.AccionSP.CONSULTAR);
                cm.Parameters.AddWithValue("@nId_Asignacion", idAsignacion);
                return cm.ExecuteReader();
            }
        }

		public System.Data.IDataReader Fetch(long? idAsignacion, long? idPrestador, string encargadoProyecto, long? idEncargadoProyecto, string prestador,
												long? idProyecto, byte? idEstatus, DateTime? fechaInicioAsignacion, DateTime? fechaFinAsignacion,
												Int16? horasPorAplicar, bool? habilitado)
		{
			using (var ctx = ConnectionManager<SqlConnection>.GetManager("SqlServer"))
			{
				var cm = ctx.Connection.CreateCommand();
				cm.CommandType = System.Data.CommandType.StoredProcedure;
				cm.CommandText = nombreProcedimiento;
				cm.Parameters.AddWithValue("@Accion", AccionDal.AccionSP.CONSULTAR);
				if(idAsignacion != null)
					cm.Parameters.AddWithValue("@nId_Asignacion", idAsignacion.Value);
				if(idPrestador != null)
					cm.Parameters.AddWithValue("@nId_Prestador", idPrestador.Value);
				if(idEncargadoProyecto != null)
					cm.Parameters.AddWithValue("@nld_Proyecto_Encargado", idEncargadoProyecto.Value);
				if(idProyecto != null)
					cm.Parameters.AddWithValue("@nId_Proyecto", idProyecto.Value);
				if(idEstatus != null)
					cm.Parameters.AddWithValue("@nId_Estatus_Asignacion", idEstatus);
				if(habilitado != null)
					cm.Parameters.AddWithValue("@bHabilitado", habilitado.Value);
				if(horasPorAplicar != null)
					cm.Parameters.AddWithValue("@nHorasPorAplicar", horasPorAplicar.Value);
				if(fechaInicioAsignacion != null)
					cm.Parameters.AddWithValue("@dFecha_Inicio_Asignacion", fechaInicioAsignacion.Value);
				if(fechaFinAsignacion != null)
					cm.Parameters.AddWithValue("@dFecha_Fin_Asignacion", fechaFinAsignacion.Value);
				if (log.IsDebugEnabled)
				{
					foreach (SqlParameter param in cm.Parameters)
					{
						log.Debug(param.ParameterName + ": " + param.Value);
					}
				}
				//ToDo: Agregar encargadoProyecto y Prestador
				if(encargadoProyecto != null || prestador != null)
					throw new Exception("Not implemented exception");
				return cm.ExecuteReader();
			}
		}

        public long Insert(long idPrestador, long idEncargadoProyecto, long idProyecto, int idEstatusAsignacion, bool habilitado, Int16 horasPorAplicar, DateTime fechaInicioAsignacion, DateTime fechaFinAsignacion)
        {
            using (var ctx = ConnectionManager<SqlConnection>.GetManager("SqlServer"))
            {
                using (var cm = ctx.Connection.CreateCommand())
                {
                    cm.CommandType = System.Data.CommandType.StoredProcedure;
                    cm.CommandText = nombreProcedimiento;
                    cm.Parameters.AddWithValue("@Accion", AccionDal.AccionSP.INSERTAR);
                    cm.Parameters.AddWithValue("@nId_Prestador", idPrestador);
                    cm.Parameters.AddWithValue("@nld_Proyecto_Encargado", idEncargadoProyecto);
                    cm.Parameters.AddWithValue("@nId_Proyecto", idProyecto);
                    cm.Parameters.AddWithValue("@nId_Estatus_Asignacion", idEstatusAsignacion);
                    cm.Parameters.AddWithValue("@bHabilitado", habilitado);
                    cm.Parameters.AddWithValue("@nHorasPorAplicar", horasPorAplicar);
                    cm.Parameters.AddWithValue("@dFecha_Inicio_Asignacion", fechaInicioAsignacion);
                    cm.Parameters.AddWithValue("@dFecha_Fin_Asignacion", fechaFinAsignacion);

                    SqlParameter paramIdProyecto = new SqlParameter("@nId_Asignacion", System.Data.SqlDbType.TinyInt);
                    paramIdProyecto.Direction = System.Data.ParameterDirection.Output;
                    cm.Parameters.Add(paramIdProyecto);
                    cm.ExecuteNonQuery();
                    return Convert.ToInt64(paramIdProyecto.Value);
                }
            }
        }

        public void Update(long idAsignacion, long idPrestador, long idEncargadoProyecto, long idProyecto, int idEstatusAsignacion, bool habilitado, Int16 horasPorAplicar)
        {
            using (var ctx = ConnectionManager<SqlConnection>.GetManager("SqlServer"))
            {
                using (var cm = ctx.Connection.CreateCommand())
                {
                    cm.CommandType = System.Data.CommandType.StoredProcedure;
                    cm.CommandText = nombreProcedimiento;
                    cm.Parameters.AddWithValue("@Accion", AccionDal.AccionSP.ACTUALIZAR);
                    cm.Parameters.AddWithValue("@nId_Asignacion", idAsignacion);
                    cm.Parameters.AddWithValue("@nId_Prestador", idPrestador);
                    cm.Parameters.AddWithValue("@nld_Proyecto_Encargado", idEncargadoProyecto);
                    cm.Parameters.AddWithValue("@nId_Proyecto", idProyecto);
                    cm.Parameters.AddWithValue("@nId_Estatus_Asignacion", idEstatusAsignacion);
                    cm.Parameters.AddWithValue("@bHabilitado", habilitado);
                    cm.Parameters.AddWithValue("@nHorasPorAplicar", horasPorAplicar);

                    var rowsAffected = cm.ExecuteNonQuery();
                    if (rowsAffected == 0)
                        throw new DataNotFoundException("ProyectoUpdate");
                }
            }
        }

        public void Delete(long idAsignacion)
        {
            using (var ctx = ConnectionManager<SqlConnection>.GetManager("SqlServer"))
            {
                using (var cm = ctx.Connection.CreateCommand())
                {
                    cm.CommandType = System.Data.CommandType.StoredProcedure;
                    cm.CommandText = nombreProcedimiento;
                    cm.Parameters.AddWithValue("@Accion", AccionDal.AccionSP.ELIMINAR);
                    cm.Parameters.AddWithValue("@nId_Asignacion", idAsignacion);
                    var rowsAffected = cm.ExecuteNonQuery();
                    if (rowsAffected == 0)
                        throw new DataNotFoundException("AsignacionDelete");
                }
            }
        }

		//public bool Update(long idAsignacion, int idEstatusAsignacion, bool habilitado, DateTime fechaBaja)
		//{
		//    return false; 
		//    using (var ctx = ConnectionManager<SqlConnection>.GetManager("SqlServer"))
		//    {
		//        using (var cm = ctx.Connection.CreateCommand())
		//        {
		//            cm.CommandType = System.Data.CommandType.StoredProcedure;
		//            cm.CommandText = nombreProcedimiento;
		//            cm.Parameters.AddWithValue("@Accion", AccionDal.AccionSP.ACTUALIZAR);
		//            cm.Parameters.AddWithValue("@nId_Estatus_Asignacion", idEstatusAsignacion);
		//            cm.Parameters.AddWithValue("@bHabilitado", habilitado);
		//            cm.Parameters.AddWithValue("@dFecha_Baja", fechaBaja);

		//            var rowsAffected = cm.ExecuteNonQuery();
		//            if (rowsAffected == 0)
		//                throw new DataNotFoundException("ProyectoUpdate");
		//            else
		//                return true;
		//        }
		//    }
		//}
    }
}
